/*
*********************************************************************************************************
*
* 模块名称 :  AD9235数据采集模块【原创】
* 文件名称 :  bsp_gpiodma_ad9235.c
* 版    本 :  V1.0
* 说    明 :  ad9235 pwm采集方式，直接读取GPIO_IDR寄存器
*
* 修改记录 :
*   版本号     日期          作者      说明
*   V1.0       2025-1-21     miaozi    正式发布
*
*
*
*********************************************************************************************************
*/

#include "bsp.h"

//  导入外部变量
extern   DMA_HandleTypeDef  hdma_tim2_ch1;        //  tim.c
extern   DMA_HandleTypeDef  hdma_tim2_ch2;        //  tim.c
//  导入外部变量

//  AD9235公共参数
#define  AD9235_CLK_TIM         &htim2               //  CLK时钟源：定时器1
#define  AD9235_CLK_TIM_CH      TIM_CHANNEL_3        //  CLK时钟通道：通道4
#define  AD9235_CLK_TIM_FRQ     275000000            //  TIM的输入频率
#define  BUFFER_SIZE            128                  //  128个采样点（单缓冲），以字为单位
//  AD9235公共参数

//  AD9235双驱动参数
#define  AD9235_DMA_VOL      &hdma_tim2_ch1         //  DMA搬运句柄
#define  AD9235_DMACH_VOL    TIM_CHANNEL_1          //  DMA搬运通道
#define  AD9235_DMATRI_VOL   TIM_DMA_CC1            //  DMA搬运触发源
#define  AD9235_DMASRC_VOL   &(GPIOD->IDR)          //  数据源寄存器

#define  AD9235_DMA_CUR      &hdma_tim2_ch2         //  DMA搬运句柄
#define  AD9235_DMACH_CUR    TIM_CHANNEL_2          //  DMA搬运通道
#define  AD9235_DMATRI_CUR   TIM_DMA_CC2            //  DMA搬运触发源
#define  AD9235_DMASRC_CUR   &(GPIOE->IDR)          //  数据源寄存器

//  AD9235双驱动参数

//  电压板AD9235驱动
__attribute__((section(".RAM_D1")))static uint16_t      ad9235_buf_vol[BUFFER_SIZE*2];      //  双缓冲区（256个采样点）
static  AD9235_BUF_T  h_AD9235_BufVol;                      //  操作AD9236缓冲区的句柄
AD9235_VAR_T          g_AD9235_Vol;                         //  操作AD9235的全局句柄
//  电压板AD9235驱动

//  电流板AD9235驱动
__attribute__((section(".RAM_D1")))static uint16_t      ad9235_buf_cur[BUFFER_SIZE*2];      //  双缓冲区（256个采样点）
static  AD9235_BUF_T  h_AD9235_BufCur;                      //  操作AD9236缓冲区的句柄
AD9235_VAR_T          g_AD9235_Cur;                         //  操作AD9235的全局句柄
//  电流板AD9235驱动

// 电压dma半传输回调，弱定义，在应用层重新定义这个函数
__WEAK  void  BSP_AD9235_VolDmaHalfCplCb(DMA_HandleTypeDef *hdma)
{
  return;
}
//  电压dma全传输回调，弱定义，在应用层重新定义这个函数
__WEAK  void  BSP_AD9235_VolDmaCplCb(DMA_HandleTypeDef *hdma)
{
  return;
}

// 电流dma半传输回调，弱定义，在应用层重新定义这个函数
__WEAK  void  BSP_AD9235_CurDmaHalfCplCb(DMA_HandleTypeDef *hdma)
{
  return;
}
//  电流dma全传输回调，弱定义，在应用层重新定义这个函数
__WEAK  void  BSP_AD9235_CurDmaCplCb(DMA_HandleTypeDef *hdma)
{
  return;
}



//  电压板AD9235驱动初始化
static void AD9235_VolInit(void)
{
//  1.电压板驱动
  // **step1 初始化stm32驱动
  /* hal层驱动已经被cubemx配置，此处忽略 */

  // **step2  配置AD9235句柄
  //缓冲区句柄配置
  h_AD9235_BufVol.pBuf        =   ad9235_buf_vol;
  h_AD9235_BufVol.buf_size    =   BUFFER_SIZE*2;
  //操作句柄配置
  g_AD9235_Vol.pBuf   =   &h_AD9235_BufVol;
  g_AD9235_Vol.pTim = AD9235_CLK_TIM;             //  时钟源定时器
  g_AD9235_Vol.TimCh  = AD9235_CLK_TIM_CH;        //  时钟源定时器通道
  g_AD9235_Vol.TimFrq = AD9235_CLK_TIM_FRQ;       //  定时器输入频率
  g_AD9235_Vol.TimPsc = 1-1;                      //  定时器预分频，缺省配置
  g_AD9235_Vol.TimArr = 275-1;                    //  定时器重载值，缺省配置
  g_AD9235_Vol.TimCompare = 0;                //  PWM比较值，缺省配置

  g_AD9235_Vol.pDma        = AD9235_DMA_VOL;      //  DMA句柄
  g_AD9235_Vol.DmaTri      = (uint32_t)AD9235_DMATRI_VOL;               //  DMA触发源
  g_AD9235_Vol.DmaTriCh    = (uint32_t)AD9235_DMACH_VOL;                //  DMA触发器通道
  g_AD9235_Vol.SrcAddress  = (uint32_t)AD9235_DMASRC_VOL;               //  DMA数据源地址
  g_AD9235_Vol.DstAddress  = (uint32_t)((g_AD9235_Vol.pBuf)->pBuf);     //  缺省配置
  g_AD9235_Vol.DataLength  = (g_AD9235_Vol.pBuf)->buf_size;             //  缺省配置

  //  **step3 配置DMA搬运缓冲区
  //  绑定DMA触发请求：AD9235_CLK_TIM更新一个周期，必须调用此宏
  __HAL_TIM_ENABLE_DMA(g_AD9235_Vol.pTim,g_AD9235_Vol.DmaTri);
  //  注册DMA半传输中断
  HAL_DMA_RegisterCallback(g_AD9235_Vol.pDma,HAL_DMA_XFER_HALFCPLT_CB_ID,BSP_AD9235_VolDmaHalfCplCb);
  //  注册DMA全传输中断
  HAL_DMA_RegisterCallback(g_AD9235_Vol.pDma,HAL_DMA_XFER_CPLT_CB_ID,BSP_AD9235_VolDmaCplCb);

  //  启动搬运，仍需要等待定时器PWM时钟才能触发
  //  HAL_DMA_Start_IT(g_AD9235_Vol.pDma, (uint32_t)g_AD9235_Vol.SrcAddress,(uint32_t)h_AD9235_BufVol.pBuf,(uint32_t)h_AD9235_BufVol.buf_size);

  //  **step4 启动定时器产生PWM，开始搬运数据
  return;
}

//  电流板AD9235驱动初始化
static void AD9235_CurInit(void)
{
//  1.电流板驱动
  // **step1 初始化stm32驱动
  /* hal层驱动已经被cubemx配置，此处忽略 */

  // **step2  配置AD9235句柄
  //缓冲区句柄配置
  h_AD9235_BufCur.pBuf        =   ad9235_buf_cur;
  h_AD9235_BufCur.buf_size    =   BUFFER_SIZE*2;
  //操作句柄配置
  g_AD9235_Cur.pBuf   =   &h_AD9235_BufCur;
  g_AD9235_Cur.pTim   = AD9235_CLK_TIM;           //  时钟源定时器
  g_AD9235_Cur.TimCh  = AD9235_CLK_TIM_CH;        //  时钟源定时器通道
  g_AD9235_Cur.TimFrq = AD9235_CLK_TIM_FRQ;       //  定时器输入频率
  g_AD9235_Cur.TimPsc = 1-1;                  //  定时器预分频，缺省配置
  g_AD9235_Cur.TimArr = 275-1;                //  定时器重载值，缺省配置
  g_AD9235_Cur.TimCompare = 0;                //  PWM比较值，缺省配置

  g_AD9235_Cur.pDma        = AD9235_DMA_CUR;      //  DMA句柄
  g_AD9235_Cur.DmaTri      = (uint32_t)AD9235_DMATRI_CUR;               //  DMA触发源
  g_AD9235_Cur.DmaTriCh    = (uint32_t)AD9235_DMACH_CUR;                //  DMA触发器通道
  g_AD9235_Cur.SrcAddress  = (uint32_t)AD9235_DMASRC_CUR;               //  DMA数据源地址
  g_AD9235_Cur.DstAddress  = (uint32_t)((g_AD9235_Cur.pBuf)->pBuf);     //  缺省配置
  g_AD9235_Cur.DataLength  = (g_AD9235_Cur.pBuf)->buf_size;             //  缺省配置

    //  **step3 配置DMA搬运缓冲区
  //  绑定DMA触发请求：AD9235_CLK_TIM更新一个周期，必须调用此宏
  __HAL_TIM_ENABLE_DMA(g_AD9235_Cur.pTim,g_AD9235_Cur.DmaTri);
  //  注册DMA半传输中断
  HAL_DMA_RegisterCallback(g_AD9235_Cur.pDma,HAL_DMA_XFER_HALFCPLT_CB_ID,BSP_AD9235_CurDmaHalfCplCb);
  //  注册DMA全传输中断
  HAL_DMA_RegisterCallback(g_AD9235_Cur.pDma,HAL_DMA_XFER_CPLT_CB_ID,BSP_AD9235_CurDmaCplCb);

  //  启动搬运，仍需要等待定时器PWM时钟才能触发
  //  HAL_DMA_Start_IT(g_AD9235_Cur.pDma, (uint32_t)g_AD9235_Cur.SrcAddress,(uint32_t)g_AD9235_Cur.pBuf,(uint32_t)h_AD9235_BufVol.buf_size);

  return;
}

//  AD9235驱动初始化
void  BSP_AD9235_Init(void)
{
  AD9235_VolInit();
  AD9235_CurInit();

  return;
}


//  重定向DMA传输设置
void BSP_AD9235_DmaRedirect(AD9235_VAR_T *pAD9235,uint32_t DstAddress,uint32_t DataLength)
{
  //  1.
  pAD9235->DstAddress = DstAddress;
  pAD9235->DataLength = DataLength;

  //  2.重定向DMA搬运区
  HAL_DMA_Abort_IT(pAD9235->pDma);
  HAL_DMA_Start_IT(pAD9235->pDma,pAD9235->SrcAddress,DstAddress,DataLength);

  return;
}

//  启动AD9235
void  BSP_AD9235_StartRecord(AD9235_VAR_T *pAD9235)
{
  HAL_TIM_PWM_Start(pAD9235->pTim,pAD9235->TimCh);

  return;
}

//  关闭AD9235
void  BSP_AD9235_StopRecord(AD9235_VAR_T *pAD9235)
{
  HAL_TIM_PWM_Stop(pAD9235->pTim,pAD9235->TimCh);

  return;
}

//  设置采样频率：所有驱动共用一个工作频率
void BSP_AD9235_SetSampleFrq(AD9235_VAR_T *pAD9235,uint32_t Frq)
{
  pAD9235->SmpFrq     = Frq;                                            //  采样频率
  pAD9235->TimArr     = (pAD9235->TimFrq/(pAD9235->TimPsc+1)/Frq)-1;    //  重载值=输入频率/预分频/工作频率
  pAD9235->TimCompare = ((pAD9235->TimArr+1)/2)-1;                      //  占空比=重载值/2

//  pAD9235->SampleStop(pAD9235);
  __HAL_TIM_SET_AUTORELOAD(pAD9235->pTim,pAD9235->TimArr);              //  配置定时器的工作频率
  __HAL_TIM_SET_COMPARE(pAD9235->pTim,pAD9235->TimCh,pAD9235->TimCompare);              //  配置AD9235的工作频率
//  pAD9235->SampleStart(pAD9235);

  return;
}






/***************************** LinkJoin(END OF FILE) *********************************/
